/*
 * file name:msg_bus.h
 * version :v1.0.1
 * Change Logs:
 * Date             Author          main change
 * 2024-01-22       lanxin          the first version
 * 2024-03-02       lanxin          update api function
 * 2024-03-05       lanxin          add xx_urgent api
 * 2024-08-23       lanxin          rename to msg_bus.h
 *
*/

/********************************************* READ ME BEGIN *************************************************************/

/* Brief:
 *
 * * 1.基于订阅与发布的消息软通道。
 *
*/

/********************************************* READ ME END ***************************************************************/

#ifndef _msg_bus_H
#define _msg_bus_H

/* source file */
#include "rtthread.h"
#include "stdint.h"

/* public define */

/* variable typedef */
typedef void ( *msg_bus_cb ) ( void *para );//function subscribe 

/* function typedef */

/* variable declaration for other to use */

/* function declaration for other to use */

/*
 * *@ author:lanxin
 * *@ brief:msg bus 初始化
 * *@ note:
 * *@ param:NONE
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_init ( void );

/*
 * *@ author:lanxin
 * *@ brief:查找主题
 * *@ note:
 * *@ param:topic_name 主题名称
 * *@ retval:
 * - 0 查找失败
 * - >0 主题结点
*/
rt_list_t *msg_bus_topic_find ( const char *topic_name );

/*
 * *@ author:lanxin
 * *@ brief:创建主题
 * *@ note:
 * *@ param:topic_name 主题名称
 * *@ retval:
 * - 0 创建失败
 * - >0 主题结点
*/
rt_list_t *msg_bus_topic_create ( const char *topic_name );

/*
 * *@ author:lanxin
 * *@ brief:通过主题结点发布消息
 * *@ note:
 * *@ param:list_topic 主题结点
 * *@ param:msg 消息内容
 * *@ param:len 消息长度
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_publish_msg_by_node ( rt_list_t *list_topic, const void *msg, int len );

/*
 * *@ author:lanxin
 * *@ brief:通过主题结点发布消息
 * *@ note:紧急发布
 * *@ param:list_topic 主题结点
 * *@ param:msg 消息内容
 * *@ param:len 消息长度
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_publish_msg_by_node_urgent ( rt_list_t *list_topic, const void *msg, int len );

/*
 * *@ author:lanxin
 * *@ brief:通过主题结点调用回调函数
 * *@ note:
 * *@ param:list_topic 主题结点
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_publish_function_by_node ( rt_list_t *list_topic );

/*
 * *@ author:lanxin
 * *@ brief:通过主题名称发布消息
 * *@ note:
 * *@ param:topic_name 主题名称
 * *@ param:msg 消息内容
 * *@ param:len 消息长度
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_publish_msg_by_name ( const char *topic_name, const void *msg, int len );

/*
 * *@ author:lanxin
 * *@ brief:通过主题名称发布消息
 * *@ note:紧急发布
 * *@ param:topic_name 主题名称
 * *@ param:msg 消息内容
 * *@ param:len 消息长度
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_publish_msg_by_name_urgent ( const char *topic_name, const void *msg, int len );

/*
 * *@ author:lanxin
 * *@ brief:通过主题名称调用回调函数
 * *@ note:
 * *@ param:topic_name 主题名称
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_publish_function_by_name ( const char *topic_name );

/*
 * *@ author:lanxin
 * *@ brief:订阅一个主题
 * *@ note:
 * - 主题不存在时，创建主题
 * - 订阅类型：消息
 *
 * *@ param:topic_name 主题名称
 * *@ param:mq 用于发布消息的消息队列
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_topic_subscribe ( const char *topic_name, rt_mq_t mq );

/*
 * *@ author:lanxin
 * *@ brief:订阅一个主题
 * *@ note:
 * - 主题不存在时，创建主题
 * - 订阅类型：回调函数
 *
 * *@ param:topic_name 主题名称
 * *@ param:cb 发布时的回调函数
 * *@ param:cb_para 回调时的参数
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_topic_subscribe_function ( const char *topic_name, msg_bus_cb cb,void *cb_para );

/*
 * *@ author:lanxin
 * *@ brief:解除订阅一个主题
 * *@ note:
 * - 订阅类型：消息
 *
 * *@ param:topic_name 主题名称
 * *@ param:mq 订阅主题时的消息队列
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_topic_unsubscribe ( const char *topic_name, rt_mq_t mq );

/*
 * *@ author:lanxin
 * *@ brief:解除订阅一个主题
 * *@ note:
 * - 订阅类型：回调函数
 *
 * *@ param:topic_name 主题名称
 * *@ param:cb 订阅主题时的回调函数
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_topic_unsubscribe_function ( const char *topic_name, msg_bus_cb cb );

/*
 * *@ author:lanxin
 * *@ brief:设置一个主题的使能状态
 * *@ note:
 * *@ param:topic_name 主题名称
 * *@ param:enable 使能状态
 * - 0 失能
 * - >0 使能
 *
 * *@ retval:
 * - 0 成功
 * - 其他失败
*/
int msg_bus_set_topic_enable ( const char *topic_name, uint8_t enable );

#endif /* _msg_bus_H */
